查看原文
其他

Stata绘图系列——让你的直方图随心所欲

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:陈志林,河南大学经济学院

本文编辑:魏若芙

技术总编:李婷婷


Stata&Python云端课程来啦!

     为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于2022年5月15日起调价,Python课程的价格调整为439.9元Stata基础课程调为439.9元Stata进阶课程调整到439.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~


引言

Stata的绘图功能非常强大,可以绘制直方图、饼形图、散点图等等。为了给大家介绍更多Stata绘图干货,我们将会持续推出Stata绘图系列推文。直方图能简单明了地展示某一变量在不同区间上的分布情况,故此它成为了统计描述中常用的方法之一。今天我们就先通过介绍直方图的绘制来带领大家了解Stata绘图的语法和逻辑,希望可以在绘图上对大家有所助益。




1.绘制直方图的简单介绍

绘制直方图的命令是twoway histogram,是Stata中自带的命令。在绘制直方图时,变量的取值可以是离散型的,也可以是连续型的。对于离散型变量,twoway histogram直接给出每个离散值点的分布频数;对于连续型变量,则首先将样本按照取值分组,给出每个取值单元的频数。

histogram的语法结构为:

histogram varname [if] [in] [weight] [, [continuous_opts | discrete_opts] options]
接下来我们通过一些具体的例子来展开介绍一下直方图的绘制以及一些绘图选项的应用。



2.离散变量的直方图

我们用Stata出厂自带的数据auto.dta来展示twoway histogram (twoway可以省略) 绘制离散变量分布直方图的具体用法。

auto数据共74个样本,变量rep78给出了样本汽车1978年的维修次数记录,其中有69个样本有维修记录,维修次数为1~5次。我们可以用histogram命令给出具体维修次数的分布直方图,最简单的histogram命令用法为:

clear allsysuse auto,clear //使用auto数据histogram rep78   //绘制变量rep78的核密度直方图

此时,我们会得到一个如下所示的直方图:

可以看到,在缺失条件下,histogram给出的是变量rep78的核密度直方图,它首先把rep78当做一个连续型变量,利用核密度方法估计出从1到5之间每个点对应的核密度,然后这些阴影部分的面积为1。接着,我们加入addlabels选项,让每个直方图都标上相应的数值。

histogram rep78, addlabels //绘制变量rep78的核密度直方图,并在直条上标注其数值

果如下所示,在每个直条上方显示出了核密度值。

实对于离散型变量rep78,利用核密度计算直方图本身是没有意义的,我们关心的是更加直观的频数分布图和频率分布图,这就需要我们在histogram命令中分别使用frequencyfraction选项,由于二者做法类似,我们这里只介绍frequency选项。

histogram rep78, addlabels frequency //绘制变量rep78的频数直方图,并在直条上显示频数值

结果如下所示:

以上的绘图中,我们并没有设定每个直条的颜色,其实直条的颜色涉及两个参数,其一是直条边框的颜色,其二是直条填充的颜色。我们可以用color()选项设定直条边框的颜色,并用粉色进行直条填充(这里我们要说明一下,在没有指定直条的填充色的情况下,histogram默认的填充色就是直条边框的颜色,我们可进一步用fcolor( )选项填充直条颜色):
histogram rep78, addlabels frequency color(blue) fcolor(pink) //绘制变量rep78的频数直方图,并将边框设置为蓝色,直条填充为粉色

我们可以得到如下直方图:

我们接下来再介绍一下addlabopts选项,借助该选项可以改变标注在直方图上频数,频率,百分比等数值字体的大小,颜色,位置等。

  • mlabstyle为设置总样式,一般有p1-p15种选项;

  • mlabsize为设置数值字体的大小,可选的选项从小到大有minuscule、quarter_tiny、third_tiny、half_tiny、tiny、vsmall、small、medsmall、medium、medlarge、large、vlarge、huge、vhuge;

  • mlabposition为设置数值放置的位置,有0-12可供选择,其中1-12分别对于时钟的12个点位,0则是在时钟的中心;

  • mlabcolor 为设置数值的颜色;

  • mlabangle设置数值的角度,比如0、45、90、180、horizontal(水平)、vertical(垂直)等。

我们用下面一个案例来展示一下这些画图选项的应用。绘制变量rep78的频数直方图,直条上显示频数、总样式设为p12、数值大小为large、位置在6点钟方向、字体颜色为blue,字体倾斜45°。

histogram rep78, addlabels frequency addlabopts(mlabstyle(p12) mlabsize(large) mlabposition(6) mlabcolor(blue) mlabangle(45))
执行的具体效果如下:

除此之外,我们也可以用lwidth( )对边框粗细进行设置,可以从没有边框(none)到细(thin),直到非常非常非常粗(vvvthick),可以选择为none、vvvthin、vvthin、vthin、thin、medthin、medium、medthick、thick、vthick、vvthick、vvvthick等选项。

而且,我们可以给每个绘制的图形给定一个标题和注释,用选项title( )note( )实现,例如,绘制变量rep78的频数直方图,直条上显示频数值、边框色为blue、填充色为pink%50、边框粗细为vthick、标题为Title:This is the title、注释为:data source:Auto.dta程序如下:

histogram rep78, addlabels frequency color(blue) fcolor(pink%50) lwidth(vthick) title(Title:This is the title ) note(data source:Auto.dta)
让我们来看一下最终的结果:

对于标题我们也可以进行一些设置,字号大小和颜色与上文类似,只需在title()选项里加上color和size即可。

其实,对于离散型的变量,我们应该加上discrete选项,定义离散数据,要求x的每个取值对应着一个直方条。

histogram rep78, discrete

当然也可以像之前一样加上 addlabels、frequency 、fraction、color等选项加以修饰,由于篇幅问题,这里不再介绍。

此外,如果我们想看看rep78如何随着foreign(是否国产)变化,by选项可以得到对应foreign两个取值的直方图。其他选项和画单个直方图的一样。

histogram rep78,discrete by(foreign) frequency //按是否国产分类绘制直方图

得到的图形如下:

对于离散型变量直方图的绘制我们的介绍基本就到这里了,最后再提一下,我们可以将histogram命令绘制的图形用选项saving(filename)保存成filename.gph格式,也可以利用以下命令将其输出为png格式的文件:

graph export histogram1.png, replace //将histogram绘制的图形输出为png格式





3.连续型单变量分布直方图

histogram不仅可以给出离散型变量的统计分布,也能够给出连续型变量的分布,我们以Stata自带的citytemp.dta文件来说明这一问题。

假定我们想知道一月份平均气温tempjan在这956个样本中的分布情况,我们可以用如下的命令实现:

clear all //清空内存sysuse citytemp, clear //读入citytemp数据histogram tempjan //绘制tempjan的直方图

该命令首先对样本按照变量tempjan的取值分为k个等间距区间,缺省条件下:

k = min{sqrt(N),10*ln(N)/ln(10)}

其中N为样本容量,以citytemp数据为例,此时,k=30。因此,histogram tempjan将变量tempjan分为30个等距离的区间,并估计出每个区间上变量tempjan的分布核密度,输出结果如下图所示:

我们也可以自己设置这些等距离区间的数量,如设置为15个等距离区间,命令如下:

histogram tempjan,bin(15)
我们这里对结果不再进行展示。
类似于离散型变量,对于连续型变量,我们也可以让Stata给出频数或者频率,我们这里只说明下频数的相关程序:
histogram tempjan,bin(15) frequency addlabels //绘制tempjan的直方图,设置为15个等距离区间,在直条上标注频数值
结果如下:

我们也可以对直方图进行一些调整,在直方条之间留出间隙、直条边框颜色为red、直条填充色为blue、线条粗细为thin:
histogram tempjan,gap(15) bin(15) frequency addlabels fcolor(blue) color(red) lwidth(thin)

我们得到以下结果:

和离散型变量类似,我们可以借助by选项来看一下tempjan 是如何随着 region(地域)变化的。
histogram tempjan,bin(15) by(region) frequency addlabels
结果如下:

此外,也可在by选项中加入total,这样就能同时画出样本整体的“总”直方图。

histogram tempjan,bin(15) by(region,total) frequency addlabels
结果如下:




4.两个变量分布的比

histogram只能给出单一变量的统计分布,但是有时候,我们需要给出两个变量的分布,比如tempjan和tempjuly的分布,并进行比较,此时我们可以用twoway将两个histogram命令拼接在一起,直接比较两个变量的分布。我们继续用Stata自带的citytemp.dta展示这一功能。

通过以上的学习,我们已经知道绘制变量tempjan和tempjuly的分布的命令,接下来我们通过twoway将这两个结果合并在一起即可。我们执行以下程序:

clear all //清空内存sysuse citytemp, clear //读入citytemp数据twoway (histogram tempjan,bin(15) frequency fcolor(pink)) (histogram tempjuly,bin(15) frequency fcolor(blue))

得到结果如下:

对这个结果我们不是很满意,比如tempjan的分布为粉红色的直条,但是部分直条被蓝色的tempjuly的直条遮住了,我们无法看到tempjan的具体分布。基于此,我们可以将这些直条的颜色设置为透明状态。比如我们可以将pink改为pink%30,将blue改为blue%50,使得直条填充色变浅,从而实现直条透明的目的。

此外,我们也借助legend选项将第一个图例改为January,第二个图例改为为July;借助legend()选项中的子选项position()设置一下标签出现的位置;最后再为这幅图加一个title。

twoway (histogram tempjan,bin(15) frequency fcolor(pink%30)) (histogram tempjuly,bin(15) frequency fcolor(blue%50)),legend(position(7) label(1 "January") label(2 "July") title("Temperature")) title("Temperature in January and July")

得到的图如下:

我们对于直方图的介绍就到这里了,虽然本文只介绍了histogram命令的部分选项,但基本满足大家平常画图的需求了,若您对画图系列感兴趣一定要继续关注我们哦!公众号接下来会发布一系列Stata绘图系列文章,为大家介绍更多Stata画图干货!

End
最后,我们为大家揭秘雪球网(https://xueqiu.com/) 最新所展示的沪深证券和港股关注人数增长Top10。



腾讯课堂课程二维码







 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!














往期推文推荐

【爬虫篇】湖人无缘季后赛,球迷如何回应

客官,要来份四象限图吗?

Python实现简繁体转换

Stata与Python交互方法及数据传递

 “青铜”爬“王者”

 留下想要的变量,你会几种方法?

 Python:朋友圈配图,我承包了

 绘制全国祠堂密度地图

 如何使用Stata绘制一幅好看的柱状图?

【爬虫篇】基于selenium爬取美团评论

 双标的莱万——足球无关政治?!

 Stata处理重复值:duplicates

It's time to send a flower to your lover!        2021各省GDP新鲜出炉

 爬虫实战-采集全国各省疫情数据

 log——为你的操作保驾护航

 一行代码教你玩转emoji

 票房遇冷的春节档口碑冠军丨《狙击手》影评分析

 学习丰县,营造良好营商环境!

 大国丢娃图:从川渝到徐州!

 丰县“失火”,殃及徐州:股市超跌近30亿!

 Unicode转义字符——编码与解码

        徐州!徐州!

        B站弹幕爬虫——冬奥顶流冰墩墩&雪容融

        不会用Stata做描述性统计表?so easy!

        丰沛之地:备足姨妈巾

 过年啦,用Python绘制一幅属于你的春联吧!

       登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

       【基础篇】查找并输出子字符串的定位

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

        如何绘制任泽平《鼓励生育基金》的几幅图

        Python 第六天——字符串

        findname——想要什么找什么

        Python字符串之“分分合合”

        PDF转docx可批量操作?——wordconvert的小技巧

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

C# 使用 OpenCvSharp 计算直方图的指南
哪本研究方法教科书适合我:入门篇 | 学科教学
R语言绘图 | 箱线图(从入门到精通)
R语言数据可视化大揭秘:探索二维散点图与箱型图、核密度估计图、直方图的完美组合!
C# 使用 OpenCvSharp 进行直方图比较

文章有问题?点此查看未经处理的缓存